const { prototype } = require('koa');
const Router = require('koa-router');
const mysql = require('mysql2/promise');
const protobuf = require('protobufjs');
const router = new Router();

// 定义数据库连接配置
const dbConfig = {
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'student',
};

// 加载 Protobuf 定义文件
let root = null;
protobuf.load('./routes/message.proto').then((loadedRoot) => {
  root = loadedRoot;
}).catch((err) => {
  console.error('Failed to load .proto file:', err);
});

// // 接收并处理 Protobuf 数据的接口
// router.post('/unit/api', async (ctx) => {
//   try {
//     // 获取请求中的二进制数据
//     console.log('Request Body:', ctx);
//     const encodedData = ctx.request.body; // 必须确保前端发送的是 Buffer 类型数据

//     // if (!encodedData || !root) {
//     //   ctx.status = 400;
//     //   ctx.body = { code: 400, message: '无效的请求数据或未加载 Protobuf 定义' };
//     //   return;
//     // }
//     console.log('二进制数据', encodedData);
//     // 将对象形式转换为数组形式
// const dataArray = Object.values(encodedData).map(Number);

// // 将数组转换为 Uint8Array
// const byteArray = new Uint8Array(dataArray);

//     // 解析 Protobuf 数据
//     const User = root.lookupType('User'); // 假设消息类型是 User
//     // const decodedData = User.decode(new Uint8Array(encodedData)); // 解码为对象
//     const decodedData = User.decode(byteArray); // 解码为对象

//     console.log('Decoded Data:', decodedData);
//     // const decodedDataObject = decodedData.toObject();
//     // 确保我们在 Protobuf 类型上调用 toObject
// const decodedDataObject = User.toObject(decodedData, {
//   longs: String, // 处理大整数为字符串（如果有的话）
//   enums: String, // 枚举转换为字符串（如果有的话）
//   defaults: true, // 保留默认值
//   oneofs: true, // 将 oneof 字段合并为一个对象
// });

// console.log('Decoded Data Object:', decodedDataObject);

//     // 将数据存储到数据库
//     const connection = await mysql.createConnection(dbConfig);
//     const query = `
//       INSERT INTO users (id, username,password,neckname)
//       VALUES (?, ?, ?)
//     `;
//     await connection.execute(query, [
//       decodedDataObject.id,
//       decodedDataObject.username,
//       decodedDataObject.password,
//       decodedDataObject.nexkname,
//     ]);
//     await connection.end();

//     // 返回响应
//     ctx.body = {
//       code: 200,
//       message: '数据处理成功',
//       data: decodedData,
//     };
//   } catch (error) {
//     console.error('处理失败:', error);
//     ctx.status = 500;
//     ctx.body = { code: 500, message: '内部服务器错误' };
//   }
// });
router.post('/unit/api', async (ctx) => {
  try {
    const encodedData = ctx.request.body;
  // console.log('数据',ctx)
  console.log('encodedData',encodedData)

    if (!encodedData || !root) {
      ctx.status = 400;
      ctx.body = { code: 400, message: '无效的请求数据或未加载 Protobuf 定义' };
      return;
    }

    const User = root.lookupType('User');
    const byteArray = new Uint8Array(Object.values(encodedData).map(Number));
    const decodedData = User.decode(byteArray);

    // 将 Protobuf 数据转换为普通对象
    const decodedDataObject = User.toObject(decodedData, {
      longs: String,
      enums: String,
      defaults: true,
      oneofs: true,
    });

    console.log('Decoded Data Object:', decodedDataObject);

    // 确保字段有值，并确保不会有 undefined 或 null
    const { id, username, password, neckname } = decodedDataObject;

    // 检查字段值
    if (id === undefined || username === undefined || password === undefined || neckname === undefined) {
      throw new Error('某些字段是 undefined');
    }

    // 确保没有 null 或 undefined，或者将其替换为合理值
    const validId = id !== undefined ? id : null;
    const validUsername = username !== undefined && username !== null ? username : '';
    const validPassword = password !== undefined && password !== null ? password : '';
    const validNeckname = neckname !== undefined && neckname !== null ? neckname : '';

    console.log('Valid Data:', { validId, validUsername, validPassword, validNeckname });

    // 将数据存储到数据库
    const connection = await mysql.createConnection(dbConfig);
    const query = `
      INSERT INTO users (id, username, password, neckname)
      VALUES (?, ?, ?, ?)
    `;
    
    // 打印查询的绑定参数
    console.log('Query parameters:', [validId, validUsername, validPassword, validNeckname]);

    await connection.execute(query, [
      validId,
      validUsername,
      validPassword,
      validNeckname,
    ]);
    await connection.end();

    // 构造返回的数据（Protobuf 编码后的数据）
    const CategoryData = root.lookupType('CategoryData');
    const responseData = {
      categories: [
        "派发", "完成", "预计未完成", "逾期未完成"
      ],
      dispatched: [
        0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 4, 0
      ],
      completed: [
        0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 4, 0
      ],
      predictedUncompleted: [
        0, 0, 0, 0, 0, 0, 0, 1, 20, 30, 90, 0
      ],
      overdueUncompleted: [
        0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 4, 0
      ]
    };

    // 创建 Protobuf 消息对象
    const message = CategoryData.create(responseData);

    // 编码为 Protobuf 格式
    const buffer = CategoryData.encode(message).finish();

    // 返回响应
    ctx.body = {
      code: 200,
      message: '数据处理成功',
      data: buffer,
      prototype:'CategoryData'
    };
    ctx.set('Content-Type', 'application/x-protobuf');  // 设置响应头为 Protobuf 类型
  } catch (error) {
    console.error('处理失败:', error);
    ctx.status = 500;
    ctx.body = { code: 500, message: '内部服务器错误' };
  }
});


module.exports = router;
